package 反射;

import com.jiazhong.Model.Goods;

import java.lang.reflect.Method;
import java.lang.reflect.Modifier;


public class MethodDemo {
    public static void main(String[] args) throws Exception {
//        getMethods();
        getMethod();
    }

    /**
     * 获得单个方法并调用
     * 确定一个唯一的方法：方法名+参数列表
     */
    public static void getMethod() throws Exception {
        Class cla=Goods.class;
        //创建cla实例对象
        Object obj = cla.newInstance();//Goods的实例化对象
        //根据方法名和参数列表来获得一个method对象，确定一个唯一的方法
        Method method= cla.getDeclaredMethod("setGoods_name", String.class);//Goods中的单一方法
        /**
         * 调用方法
         * 参数1：那个对象的方法
         * 参数2：方法的参数值
         * 返回值：方法的返回值
         */
        Object returnValue = method.invoke(obj, "强哥");
        if (returnValue==null){
            System.out.println("无返回值");
        }else {
            System.out.println("返回值是"+returnValue);
        }



        //获取getUsername方法的Method对象
        Method method1= cla.getDeclaredMethod("getGoods_name");
        //调用方法
        Object val = method1.invoke(obj);
        System.out.println(val);
    }

    /**
     * 使用反射操作类中的方法
     */
    private static void getMethods() {
        Class cla= Goods.class;
        //获得类中的所有方法
        Method[] methods = cla.getDeclaredMethods();
        //遍历Methods
        for (Method method:methods
             ) {
            //获得方法名
            String methodName = method.getName();
            //获得方法的返回类型
            Class returnType = method.getReturnType();
            //获得方法的修饰符
            String modifier_str = Modifier.toString(method.getModifiers());
            //获得参数列表,获得的是参数列表中参数的类型
            Class[] parameterTypes = method.getParameterTypes();
            //获得方法抛出的异常类型
            Class[] exceptionTypes = method.getExceptionTypes();
            System.out.println(methodName+" "+returnType+" "+modifier_str);
            System.out.println("遍历参数列表");
            for (Class parameter:parameterTypes){
                System.out.println(parameter);
            }
            System.out.println("遍历异常类型列表");
            for (Class exception:exceptionTypes
                 ) {
                System.out.println(exception);
            }
            System.out.println("--------------");
        }
    }
}
